package org.sakaiproject.citation.util.impl;
import org.sakaiproject.citation.util.api.SearchQuery;
public class CQLSearchQuery
implements org.sakaiproject.citation.util.api.CQLSearchQuery {
private static final org.apache.commons.logging.Log LOG =
org.apache.commons.logging.LogFactory.getLog(
"org.sakaibrary.common.search.impl.CQLSearchQuery" );
private org.sakaiproject.citation.util.api.SearchQuery searchQuery;
private String cqlQuery;
/**
* Gets a CQL-formatted search query by converting searchQuery.
*
* @param searchQuery SearchQuery object to convert.
* @return the search query in CQL format or null if searchQuery is null.
*/
public String getCQLSearchQueryString(
org.sakaiproject.citation.util.api.SearchQuery searchQuery ) {
if( searchQuery == null ) {
return null;
}
this.searchQuery = searchQuery;
// get criteria strings
String keywordString = getKeywordString();
String titleString = getTitleString();
String authorString = getAuthorString();
String subjectString = getSubjectString();
String yearString = getYearString();
// debugging
LOG.debug( "going to parse - keyword: " + keywordString +
"; title: " + titleString + "; author: " + authorString + "; subject: "
+ subjectString + "; year: " + yearString );
// concatenate criteria strings
StringBuilder searchStringBuilder = new StringBuilder();
if( keywordString != null ) {
searchStringBuilder.append( keywordString + " " );
}
if( titleString != null ) {
searchStringBuilder.append( titleString + " ");
}
if( authorString != null ) {
searchStringBuilder.append( authorString + " ");
}
if( subjectString != null ) {
searchStringBuilder.append( subjectString + " ");
}
if( yearString != null ) {
searchStringBuilder.append( yearString + " ");
}
// manipulate the buffer
String searchString = searchStringBuilder.toString();
searchString = searchString.substring( 0, searchString.length() - 1 );
searchString = searchString.replaceAll( "\\s", " and " );
// debugging
LOG.debug( "full search string to parse: " + searchString );
// convert the searchString to CQL
org.z3950.zing.cql.CQLParser parser = new org.z3950.zing.cql.CQLParser();
org.z3950.zing.cql.CQLNode root = null;
try {
// parse the criteria
root = parser.parse( searchString );
} catch( java.io.IOException ioe ) {
LOG.warn( "CQLSearchQuery.getCQLSearchQueryString() IO " +
"exception while parsing: " + ioe.getMessage() );
} catch( org.z3950.zing.cql.CQLParseException e ) {
LOG.warn( "CQLSearchQuery.getCQLSearchQueryString() CQL " +
"parsing exception while parsing: " + e.getMessage() );
}
cqlQuery = ( root == null ) ? null : root.toCQL();
return cqlQuery;
}
private String getKeywordString() {
java.util.Set<String> keywords = searchQuery.getKeywords();
String keywordString = null;
if( keywords != null ) {
keywordString = criteriaCleanup( keywords, "keyword" );
}
return keywordString;
}
private String getTitleString() {
java.util.Set<String> titles = searchQuery.getTitles();
String titleString = null;
if( titles != null ) {
titleString = criteriaCleanup( titles, "title" );
}
return titleString;
}
private String getAuthorString() {
String authorString = null;
java.util.Set<String> authors = searchQuery.getAuthors();
if( authors != null ) {
authorString = criteriaCleanup( authors, "author" );
}
return authorString;
}
private String getSubjectString() {
String subjectString = null;
java.util.Set<String> subjects = searchQuery.getSubjects();
if( subjects != null ) {
subjectString = criteriaCleanup( subjects, "subject" );
}
return subjectString;
}
private String getYearString() {
java.util.Set<String> years = searchQuery.getYears();
String yearString = null;
if( years != null ) {
yearString = criteriaCleanup( years, "year" );
}
return yearString;
}
private String criteriaCleanup( java.util.Set<String> criteriaSet,
String criteriaName ) {
java.util.Iterator criteria = criteriaSet.iterator();
StringBuilder result = new StringBuilder();
while( criteria.hasNext() ) {
result.append( " " + criteriaName + "=" );
String criterion = ( String ) criteria.next();
// remove any punctuation
criterion = criterion.replaceAll( "\\p{Punct}", " " );
criterion = criterion.trim();
// take care of any adjacent spaces
criterion = criterion.replaceAll( "\\s+", " " );
// replace spaces with +
criterion = criterion.replaceAll( "\\s", "+" );
// append this keyword
result.append( criterion );
}
return ( result.toString().trim().equals("") ) ? null :
result.toString().trim();
}
}